其他
领域驱动设计(DDD)在有赞教育线索资源管理的实践
文 | 程英杰 on 有赞教育
一、项目背景
二、领域驱动基础概念介绍
2.1 领域驱动设计标准分层架构
2.1.1 基础设施层
2.1.2 领域层
2.1.3 应用层
2.1.4 用户界面层
2.1.5 线索管理应用工程结构简单介绍
出于商业保密性,实际工程结构中部分模块做了隐藏
demo-api:接口层,系统之间或者对外的接口声明,通过RPC调用的方式对外提供二方服务。 demo-biz:应用服务、领域服务处理层,接口层所声明接口的具体实现。 demo-dependency:外部系统的调用封装,比如,系统需要调用商品中心的服务,则需要在本module中封装client。 demo-domain:领域层,系统领域的一些model、上下文对象、仓储接口定义等。 demo-web:对外的REST接口。 demo-dal:基础设施层,数据持久化。
2.2 需求分析利器 — 四色原型图
2.3 DDD几个核心领域概念
2.3.1 实体
实体是数据(属性)和行为(业务逻辑关系)的结合体; 每个实体都有自己的唯一标识,判断两个实体对象是否相等,是通过唯一标识来判断的。比如,两个实体对象,如果唯一标识相等,即使其他属性不相等,这两个实体也会认为是同一个。实体的其他属性不相等,表征的是同一个实体在其生命周期的不同阶段。 实体的唯一标识属性值是不可变的,其他属性值是可变的。
2.3.2 值对象
值对象不需要唯一标识,判断两个值对象是否相等,是通过值对象内部所有属性值是否相等来判断的。 值对象的属性值是不允许变化的,即值对象的实体在创建之后就不会变了,如果要改变其属性值,就需要先把此对象删除,然后重新创建一个新对象。
2.3.3 聚合
2.3.4 仓储
仓储是连接领域层和基础设施层的桥梁,一般将仓储接口定义放在领域层,仓储的具体实现放在基础设施层。这样做的好处是:解耦了领域层与ORM之间的联系,任何ORM相关的变更,只需要修改仓储的实现便可,对于领域层仓储接口的定义一般是不需要做修改的。 仓储里面存储的对象一定是聚合,因为领域模型中都是以聚合来划分业务边界的,所以在实际应用中,我们只会对聚合设计仓储。同理,我们在仓储中做数据更新、删除等操作时,应该以聚合为单位进行操作,而不是仅操作聚合中的某一个实体。
三、线索资源管理DDD实战
根据需求,采用四色原型分析法建立一个初步的领域模型; 进一步分析领域模型,识别出哪些是实体,哪些是值对象,哪些是领域服务; 对实体、值对象进行关联和聚合,提炼出聚合边界和聚合根; 为聚合根设计仓储(一般情况下,一个聚合分配一个仓储),同时,思考实体、值对象的创建方式,是通过工厂创建,还是直接通过构造函数; 走查需求场景,验证设计的领域模型的合理性。
3.1 场景分析提炼四色原型图
3.2 领域模型中实体/值对象/领域服务/聚合识别
实际的线索信息比图3-8中定义的要复杂,出于商业保密性,这里仅列出部分字段,且部分字段采用xxx来表示。
四、总结与思考
扩展阅读
-The End-
Vol.214
有赞技术团队
为 442 万商家,150 个行业,330 亿电商交易额
提供技术支持
微商城|零售|美业 | 教育
微信公众号:有赞coder 微博:@有赞技术
技术博客:tech.youzan.com
The bigger the dream,
the more important the team.